/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package carreras;

import carreras.entidades.Categorias;
import carreras.entidades.TipoTiempos;
import carreras.logger.CarrerasLogger;
import carreras.util.ApplicationInstanceManager;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.sql.SQLException;
import java.util.Collection;
import java.util.Collections;
import java.util.Properties;

/**
 *
 * @author fanky10<fanky@gmail.com>
 */
public class Configuracion {
    //warns connection to db
    public static boolean WARN=true;
    //properties file of a db
    public static String DB_PROPERTIES_FILE="default_db.properties";
    //system path as default user dir
    private static String path_config=null;
    private static Configuracion single_conf = null;
    public static Configuracion getInstance(){
        if(single_conf == null){
            createInstance();
        }
        return single_conf;
    }
    private static void createInstance(){
        single_conf = new Configuracion();
    }
    
    
    public static final String PROPERTIES_PACKAGE = "/carreras/properties/";
    public static String getCurrentInnerValue(String inner_prop_file,String key,String default_value){        
        InputStream is = null;
        try{
            is = Configuracion.class.getResourceAsStream(inner_prop_file);
            Properties properties = new Properties();
            properties.load(is);
            return properties.getProperty(key);
        }catch(java.io.IOException e){
            //ignored --que mas puedo hacer..?
            return default_value;
        }finally{
            try{
                if(is!=null)
                    is.close();
            }catch(IOException ex){
                //ignored --que mas puedo hacer..?
            }
        }
    }
    public static String getCurrentSysVersion(){
        return getCurrentInnerValue(PROPERTIES_PACKAGE + "versioning.properties", "version", "0.0");
    }
    private int cant_carriles; //por default
    private carreras.negocio.Configuracion nConfig;
    private Categorias categorias;
    /*
     * carga todas los atributos de la tabla configuracion de la db
     * TODO: traer datos de la db y version de la propertiesfile
     */
    private Configuracion(){
        nConfig = new carreras.negocio.Configuracion();
        cant_carriles = Integer.parseInt(nConfig.getValue("cant_carriles", "2"));//default
        try{
            categorias = new carreras.negocio.NegCategorias().getCategorias();
        }catch(SQLException ex){
            System.err.println("sqlex cargando tiempos: "+ex.getMessage());
        }
    }
    
    public static void init_conf(String args[]){
        data.MySQL.DEFAULT_PASS="intouch";
        data.MySQL.DEFAULT_USER="carreras";
        data.config.Configuracion.DB_PROPERTIES_FILE = "carreras.properties";
        carreras.Configuracion.DB_PROPERTIES_FILE = "carreras.properties";
        //TODO: (fanky10) verificar argumento verifica_apertura
        carreras.datos.connection.DBConnector.DEBUG=true;
        arduino.logs.Debugger.DEBUG=false;
        ApplicationInstanceManager.SINGLE_INSTANCE_NETWORK_SOCKET_PORT=45577;
        for(String a: args){
            if(Utilidades.isKeyFound(a, "ard_debug")){
                arduino.logs.Debugger.DEBUG = Utilidades.getValue(a, "ard_debug").equals("1");
            }
            if(Utilidades.isKeyFound(a, "db_debug")){
                data.DBConnector.DEBUG = Utilidades.getValue(a, "db_debug").equals("1");
            }
            if(Utilidades.isKeyFound(a, "car_debug")){
                CarrerasLogger.DEBUG = Utilidades.getValue(a, "car_debug").equals("1");
            }
            
            if(Utilidades.isKeyFound(a, "init_carr")){
                carreras.gui.frmCarrera.AUTO_INICIA_CARRERA = Utilidades.getValue(a, "init_carr").equals("1");
            }
            if(Utilidades.isKeyFound(a, "ard_instance")){
                carreras.ArduinoManager.ARDUINO_INSTANCE = Integer.parseInt(Utilidades.getValue(a, "ard_instance"));
            }
        }
    }
    
    public static Properties getDBProperties() {
        String full_path = getPath_config()+java.io.File.separator+ DB_PROPERTIES_FILE;
        System.out.println("INFO: getting db configuration from: "+full_path);
        return getDBProperties(full_path);
    }
    
    public static Properties getDBProperties(String file_path) {
        try{
            Properties props = new Properties();
            props.load(new FileInputStream(file_path));
            return props;
        }
        catch(IOException ex){
            warn("ioe: "+ex);
            System.exit(-1);
        }
        return null;
    }
    
    private static void warn(String text){
        if(WARN){
            System.out.println("WARNING: "+text);
            javax.swing.JOptionPane.showMessageDialog(null, text);
        }
    }
    /**
     * se utiliza un metodo en vez de un atributo publico por la necesidad de validar internamente si es correcto el path actual
     * @return el path de configuracion de la libreria de datos
     */
    public static String getPath_config() {
        if(path_config == null || path_config.isEmpty()){
            return System.getProperty("user.dir");
        }
        return path_config;
    }

    public static void setPath_config(String path_config) {
        Configuracion.path_config = path_config;
    }

    public int getCant_carriles() {
        return cant_carriles;
    }
    //devuelvo un clon de los tipos de tiempos existentes.. 
    //asi no se hace referencia siempre al mismo arreglo
    public TipoTiempos getTipos_tiempos() {
        try{
            return  new carreras.negocio.TipoTiempo().getTipoTiempos();
        }catch(SQLException ex){
            System.err.println("sqlex cargando tiempos: "+ex.getMessage());
            CarrerasLogger.warn(Configuracion.class, "sqlex cargando tiempos..."+ex.getMessage());
        }
        return null;//un buen nullpointerException :D
    }
    
    

}

